import { APP_THEME_CONFIG } from "./theme";
import {
  APP_LAYOUT_HEADER_CONFIG,
  APP_LAYOUT_FOOTER_CONFIG,
  APP_LAYOUT_SIDEBAR_CONFIG,
  APP_LAYOUT_BREADCRUMB_CONFIG,
  APP_LAYOUT_BODY_CONFIG,
  APP_LAYOUT_CONFIG,
} from "./layout";
import { APP_REQUEST_CONFIG } from "./request";
import { APP_ROUTER_META_DEFAULT_CONFIG, APP_ROUTER_CONFIG } from "./router";

/** 环境模式 */
const envMode = import.meta.env.MODE;

/** 是生产环境 */
const isProd = envMode === "production";

/** 是开发环境 */
const isDev = envMode === "development";

/** 缓存命名空间初始值 */
const cacheNamespaceInit = import.meta.env.VITE_CACHE_NAMESPACE;

/** 应用基础信息 */
export const APP_BASE_INFO = Object.freeze({
  /** 应用名称 */
  name: import.meta.env.VITE_APP_NAME,
});

/**
 *  应用环境
 * ----
 * 如果想tree shaking 死代码或死模块 直接通过 import.meta.env
 * ----
 * 几行代码 且没有其他依赖可用使用
 */
export const APP_ENV_INFO = Object.freeze({
  /** 环境模式 */
  mode: envMode,
  /** 是生产环境 */
  isProd,
  /** 是开发环境 */
  isDev,
});

/** 应用缓存 */
export const APP_CACHE_CONFIG = Object.freeze({
  /** 命名空间 */
  namespace: isProd ? cacheNamespaceInit : `${cacheNamespaceInit}:${envMode}`,
});

export {
  APP_THEME_CONFIG,
  APP_LAYOUT_HEADER_CONFIG,
  APP_LAYOUT_FOOTER_CONFIG,
  APP_LAYOUT_SIDEBAR_CONFIG,
  APP_LAYOUT_BREADCRUMB_CONFIG,
  APP_LAYOUT_BODY_CONFIG,
  APP_LAYOUT_CONFIG,
  APP_REQUEST_CONFIG,
  APP_ROUTER_META_DEFAULT_CONFIG,
  APP_ROUTER_CONFIG,
};

/** 配置方法集合 */
const CONFIG_FN_COLLECTION: {
  /** 获取token方法 */
  getTokenFn?: () => string;
  /** 登录方法 */
  loginFn?: () => void;
  /** 刷新token方法 */
  refreshTokenFn: () => Promise<any>;
  /** 刷新权限信息方法 */
  refreshAuthFn: () => Promise<any>;
} = {
  getTokenFn: undefined,
  loginFn: undefined,
  refreshTokenFn: () => {
    return Promise.reject(new Error("刷新token方法未设置"));
  },
  refreshAuthFn: () => {
    return Promise.reject(new Error("刷新权限信息方法未设置"));
  },
};

/** 设置获取token的方法 */
export const setGetTokenFn = (
  fn: (typeof CONFIG_FN_COLLECTION)["getTokenFn"],
) => {
  CONFIG_FN_COLLECTION.getTokenFn = fn;
};

/** 设置登录方法 */
export const setLoginFn = (fn: (typeof CONFIG_FN_COLLECTION)["loginFn"]) => {
  CONFIG_FN_COLLECTION.loginFn = fn;
};

/** 设置刷新方法 */
export const setRefreshTokenFn = (
  fn: (typeof CONFIG_FN_COLLECTION)["refreshTokenFn"],
) => {
  CONFIG_FN_COLLECTION.refreshTokenFn = fn;
};

/** 设置刷新权限方法 */
export const setRefreshAuthFn = (
  fn: (typeof CONFIG_FN_COLLECTION)["refreshAuthFn"],
) => {
  CONFIG_FN_COLLECTION.refreshAuthFn = fn;
};

/** 获取token */
export const getToken = () => {
  return CONFIG_FN_COLLECTION.getTokenFn?.();
};

/** 去登录 */
export const goToLogin = () => {
  console.log("goToLogin");
  CONFIG_FN_COLLECTION.loginFn?.();
};

/** 刷新token */
export const refreshToken = async () => {
  console.log("refreshToken");
  await CONFIG_FN_COLLECTION.refreshTokenFn?.();
};

/** 刷新权限信息 */
export const refreshAuth = async () => {
  console.log("refreshAuth");
  await CONFIG_FN_COLLECTION.refreshAuthFn?.();
};

/** 业务错误枚举 */
export enum BusinessErrorEnum {
  /** token过期 */
  TOKEN_EXPIRED = 405,
  /** 未登录 */
  NOT_LOGIN = 401,
  /**
   * 无权限
   * ----
   * 需要刷新权限接口
   */
  NOT_AUTHORIZED = 403,
  /**
   * 用户被踢
   * ----
   * 等同于未登录 但需要toast提示
   */
  KICK_OUT_BY_TERMINAL = 409,
  /**
   * 用户被禁用
   * ----
   * 等同于未登录 但需要toast提示
   */
  USER_DISABLE = 410,
  /**
   * 异常回退至未登录
   * ----
   * 等同于未登录 但需要toast提示
   */
  ABNORMAL_FALLBACK_TO_NOT_LOGIN = 411,
}

/** 列表分页当前key */
export const listCurrentPageKey = "currentPage";

/** 列表分页每页条数key */
export const listPageSizeKey = "pageSize";
